#!/bin/bash

# Nginx日志分析脚本
# 统计高频访问IP，用于识别潜在攻击源

# 配置参数
LOG_FILE="/var/log/nginx/access.log"  # Nginx访问日志路径
TOP_N=10                              # 显示前N个高频IP
THRESHOLD=1000                        # 告警阈值(单位时间内的请求数)

# 显示使用帮助
usage() {
    echo "用法: $0 [选项]"
    echo "  -f <日志文件>  指定Nginx日志文件路径，默认: $LOG_FILE"
    echo "  -n <数量>      显示前N个高频IP，默认: $TOP_N"
    echo "  -t <阈值>      设置告警阈值，默认: $THRESHOLD"
    echo "  -h             显示帮助信息"
    exit 1
}

# 解析命令行参数
while getopts "f:n:t:h" opt; do
    case $opt in
        f) LOG_FILE="$OPTARG" ;;
        n) TOP_N="$OPTARG" ;;
        t) THRESHOLD="$OPTARG" ;;
        h) usage ;;
        *) usage ;;
    esac
done

# 检查日志文件是否存在
if [ ! -f "$LOG_FILE" ]; then
    echo "错误: 日志文件 $LOG_FILE 不存在!"
    exit 1
fi

echo "===== Nginx日志分析结果 ($(date)) ====="
echo "分析的日志文件: $LOG_FILE"
echo "----------------------------------------"

# 提取IP并统计访问次数（按Common Log Format格式）
echo "访问频率最高的前$TOP_N个IP:"
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n "$TOP_N"

echo "----------------------------------------"
echo "超过阈值($THRESHOLD次)的IP:"
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | awk -v threshold="$THRESHOLD" '$1 > threshold'

echo "----------------------------------------"
echo "分析完成。总请求数: $(wc -l < "$LOG_FILE")"
echo "独立IP数: $(awk '{print $1}' "$LOG_FILE" | sort | uniq | wc -l)"
